package com.lpf;

import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;

import java.util.List;

/**
 * AttachMain 类，其中会通过 Attach API 监听上面 main() 方法的启动，这里每隔 1s 检查一次所有的 Java 虚拟机，当发现有新的虚拟机出现的时候，
 * 就调用 attach() 方法，将 TestAgent 所在的 jar 包“附加”上去，“附加”成功之后，TestAgent 就会通过 Transformer 修改 TestClass 类定义。
 *
 * 先启动 AgentmainAttachMain 类，然后启动 AgentmainTest01 类。
 */
public class AgentmainAttachMain {

    public static void main(String[] args) throws Exception {

        List<VirtualMachineDescriptor> listBefore = VirtualMachine.list();
        String jar = "E:\\IdeaProjects\\skywalking\\skywalking-learning\\java-agent\\target\\java-agent-1.0.0.jar"; // agentmain()方法所在jar包

        while (true) {
            List<VirtualMachineDescriptor> listAfter = VirtualMachine.list();
            for (VirtualMachineDescriptor vmd : listAfter) {
                if (!listBefore.contains(vmd)) { // 发现新的JVM
                    VirtualMachine vm = VirtualMachine.attach(vmd); // attach到新JVM
                    vm.loadAgent(jar); // 加载agentmain所在的jar包
                    vm.detach(); // detach 分离
                    return; // 这里就停止了
                }
            }
            Thread.sleep(1000);
        }
    }

}
